package test;

/**
 * @author 豆包LU
 * @date 2023/4/19 11:19
 */
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SimpleDateFormatThreadSafetyExample {
        // 程序执行的总次数
        private static final int EXECUTE_COUNT = 10000;
        // 同时运行的线程数量
        private static final int THREAD_COUNT = 20;

        public static void main(String[] args) {
            // 创建线程池，用于并发执行任务
            ExecutorService executorService = Executors.newCachedThreadPool();
            // 创建信号量，用于限制并发数量
            Semaphore semaphore = new Semaphore(THREAD_COUNT);
            // 创建倒计时器，用于等待所有线程执行完毕
            CountDownLatch countDownLatch = new CountDownLatch(EXECUTE_COUNT);

            // 创建SimpleDateFormat对象，用于格式化和解析日期
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

            // 并发执行任务
            for (int i = 0; i < EXECUTE_COUNT; i++) {
                executorService.submit(() -> {
                    try {
                        // 获取信号量，限制并发数量
                        semaphore.acquire();
                        // 执行业务操作
                        Date date = simpleDateFormat.parse("2020-01-01");
                        // 释放信号量
                        semaphore.release();
                        // 倒计时器减1
                        countDownLatch.countDown();
                    } catch (ParseException e) {
                        // 捕获异常，打印相关信息
                        e.printStackTrace();
                        System.out.println("线程：" + Thread.currentThread().getName() +"格式化日期失败");
                        // 退出程序的运行
                        System.exit(0);
                    } catch (NumberFormatException e){
                        // 捕获异常，打印相关信息
                        e.printStackTrace();
                        System.out.println("线程：" + Thread.currentThread().getName() +"格式化日期失败");
                        // 退出程序的运行
                        System.exit(0);
                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
            }

            // 等待所有线程执行完毕
            try {
                countDownLatch.await();
                // 所有线程格式化日期成功，输出提示信息
                System.out.println("所有线程格式化日期成功");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 关闭线程池
                executorService.shutdown();
            }
        }


}

